import logging
import uvicorn
import os
import sys
import argparse
from typing import Optional
from app.core.config import load_config_from_yaml, get_settings, _settings

# 解析命令行参数
parser = argparse.ArgumentParser(description='启动FastAPI应用')
parser.add_argument('--env', type=str, help='指定环境：dev, alpha, prod 等')
parser.add_argument('--port', type=int, help='指定服务器端口（覆盖配置文件）')
parser.add_argument('--config', type=str, help='指定配置文件路径（优先级高于--env）')
args = parser.parse_args()

# 根据命令行参数加载配置
def initialize_settings():  # 函数返回类型将在运行时确定
    """根据命令行参数初始化配置"""
    global _settings
    
    # 设置环境变量
    if args.env:
        os.environ['activateEnv'] = args.env
        print(f"使用命令行参数指定的环境配置: {args.env}")
    
    # 加载配置
    try:
        if args.config:
            # 使用指定的配置文件
            _settings = load_config_from_yaml(config_path=args.config)
            print(f"使用指定配置文件: {args.config}")
        else:
            # 使用环境或默认配置
            _settings = load_config_from_yaml(env=args.env or os.environ.get('activateEnv'))
        
        if _settings is None:
            error_msg = "配置加载失败"
            if args.env:
                error_msg += f"，请确保配置文件 'application-{args.env}.yml' 存在且可读"
            elif not args.config:
                error_msg += "，请确保默认配置文件 'application.yml' 存在且可读"
            print(error_msg)
            return None
        
        return _settings
    except Exception as e:
        print(f"加载配置时发生错误: {e}")
        return None

# 初始化配置
settings = initialize_settings()
if settings is None:
    sys.exit(1)

# 设置基本日志配置
logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
)
logger = logging.getLogger(__name__)

if __name__ == "__main__":
    # 使用属性访问方式获取配置
    app_config = settings.app_config
    db_config = settings.db_config
    log_config = settings.log_config
    
    # 确定端口号（命令行参数优先）
    port = args.port if args.port else app_config.port
    
    logger.info(f"Starting {app_config.name} version {app_config.version}...")
    logger.info(f"Server will run on port {port}")
    logger.info(f"Database connected to: {db_config.host}:{db_config.port}/{db_config.database}")
    logger.info(f"Current environment: {settings.get_env()}")
    
    # 根据环境决定是否启用热重载
    reload_mode = not settings.is_prod()
    if reload_mode:
        logger.info("开发模式：已启用热重载")
    else:
        logger.info("生产模式：已禁用热重载")
    
    # 准备UVicorn配置
    uvicorn_config = {
        "host": "0.0.0.0",
        "port": port,
        "reload": reload_mode,
        "log_level": log_config.level.lower(),
        "access_log": False,  # 关闭默认访问日志，使用我们的中间件记录
        "workers": 1,  # 开发环境单worker
    }
    
    # 生产环境优化
    if settings.is_prod():
        uvicorn_config["workers"] = min(os.cpu_count() or 4, 4)  # 根据CPU核心数调整，最多4个worker
        uvicorn_config["loop"] = "uvloop"  # 使用更快的事件循环
        uvicorn_config["http"] = "httptools"  # 使用更快的HTTP解析器
    
    logger.info(f"Starting with {uvicorn_config['workers']} worker(s)")
    
    # 启动UVicorn服务器
    uvicorn.run("main:app", **uvicorn_config)